package com.lw.lwte.testengin.listener;

import com.lw.lwte.common.helper.TestngHelper;
import lombok.extern.slf4j.Slf4j;

import org.testng.*;

import java.util.Iterator;

/**
 * @author lw
 */
@Slf4j
public class BasicCaseListener extends TestListenerAdapter {

    @Override
    public void onTestSuccess(ITestResult tr) {
        super.onTestSuccess(tr);
        logTestEnd(tr, "Success");
    }

    @Override
    public void onTestFailure(ITestResult tr) {
        super.onTestFailure(tr);
        logTestEnd(tr, "Failed");
    }

    @Override
    public void onTestSkipped(ITestResult tr) {
        super.onTestSkipped(tr);
        logTestEnd(tr, "Skipped");
    }

    @Override
    public void onTestStart(ITestResult iTestResult) {
        super.onTestStart(iTestResult);
        logTestStart(iTestResult);
    }

    /**
     * 在用例执行结束时，打印用例的执行结果信息
     *
     * @param tr
     * @param result
     */
    protected void logTestEnd(ITestResult tr, String result) {
        Reporter.log(String.format("[END]: %s = %s\n", tr.getName(), result), true);
    }

    /**
     * 在用例开始时，打印用例的一些信息，比如@Test对应的方法名，用例的描述等等
     *
     * @param tr
     */
    protected void logTestStart(ITestResult tr) {
        Reporter.log(String.format("[START]: %s", tr.getName()), true);
        printCaseInfo(tr);
    }

    /**
     * 当用例失败自动重跑，为防止测试报告中的case数会增多，重写onFinish方法
     *
     * @param testContext
     */
//    @Override
//    public void onFinish(ITestContext testContext) {
//        Iterator<ITestResult> listOfFailedTests = testContext.getFailedTests().getAllResults().iterator();
//        while (listOfFailedTests.hasNext()) {
//            ITestResult failedTest = listOfFailedTests.next();
//            ITestNGMethod method = failedTest.getMethod();
//            if (testContext.getFailedTests().getResults(method).size() > 1) {
//                listOfFailedTests.remove();
//            } else {
//                if (testContext.getPassedTests().getResults(method).size() > 0) {
//                    listOfFailedTests.remove();
//                }
//            }
//        }
//    }


    /**
     * 添加测试案例描述信息处理
     */
    protected void printCaseInfo(ITestResult testResult) {
        if(TestngHelper.skipExecute()){
            return;
        }

        //Error级别不打用例印详细信息
        if(log.isErrorEnabled()){
            return;
        }
// todo: 后续开启详细日志优化此处
//        ITestNGMethod method = testResult.getMethod();
//        CaseBean cb = new CaseBean();
//        cb.setName(method.getMethodName());
//        cb.setDescription(method.getDescription());
//        cb.setClassName(method.getRealClass().getName());
//        cb.setCaseType(CaseType.PositiveCase.toString());
//        cb.setCaseImportance(ImportanceType.High.toString());
//        cb.setStepsinfo(ConstInfo.DEFAULT_STEPSINFO);
//
//        //解析注解内容
//        if (method.getConstructorOrMethod().getMethod().isAnnotationPresent(TestCase.class)) {
//            TestCase tc = method.getConstructorOrMethod().getMethod().getAnnotation(TestCase.class);
//            String description = tc.description();
//            if(!StringHelper.isNullOrBlank(description)){
//                cb.setDescription(description);
//            }
//            cb.setAuthor(tc.author() == null ? "" : tc.author());
//            cb.setCaseType(tc.type().toString());
//            cb.setCaseImportance(tc.importance().toString());
//            cb.setStepsinfo(tc.stepsinfo());
//        }
//
//        Reporter.log("Author: " + cb.getAuthor(), true);
//        Reporter.log("ClassName: " + cb.getClassName(), true);
//        Reporter.log("CaseType: " + cb.getCaseType(), true);
//        Reporter.log("Priority: " + cb.getCaseImportance(), true);
//        Reporter.log("StepsInfo: \n" + cb.getStepsinfo(), true);
    }
}


